const express = require("express");//"express": "^4.17.1",
const {v4} =require('uuid')
const UserCountTables=require('../db/UserCountDB/UserTable')
const UserDetailTables=require('../db/UserDetailDB/UserDetailTable')
const BlogTables=require('../db/BlogDataDB/BlogTable')
let blogApp = express()
//新增
blogApp.post('/create',async function (req,res){
//    获取发送的信息
    let newBlogData={
        title:req.body.title,
        tags:req.body.tags,
        description:req.body.description,
        cover:req.body.cover,
        content:req.body.content,
        comment:[],
        author:{
            userName:'',
            avatar:''
        },
        lastModified:new Date(),
        views:0,
        likes:0,
        blogId:1,
        approve:false
    }

    //博客id的自增设置
    await BlogTables.find({},{blogId: true},{sort:{blogId:-1}}).then(rs=>{

        if (rs.length){
            newBlogData.blogId=rs[0].blogId+1
        }else {
            newBlogData.blogId=1
        }

    })

    //获取author数据
    UserCountTables.find({token:req.headers.authorization}).then(rs=>{
        newBlogData.author.userName=rs[0].userName
        newBlogData.author.avatar=rs[0].avatar

        //同步详情
        UserDetailTables.updateOne({
            key:rs[0].key
        },{
            $push:{
                'articles':newBlogData.blogId
            }
        }).then(rs=>{
            console.log("博客添加到了作者归属下面")
        })
        //创建博文
        BlogTables.create(newBlogData).then(rs=>{
            res.send({
                status:200,
                message:"文章发布成功"
            })
        }).catch(err=>{
            res.send({
                status:500,
                message:"文章发布失败"
            })
        })
    })







})

//获取
blogApp.get('/getPublicBlog',async function (req,res){

    //获取数据
    let params={}
    let offset=req.query.offset
    let limit=req.query.limit
    let searchKey =req.query.searchKey

    console.log(offset,limit)
    //searchKey 查询
    if(searchKey){
        params.title = new RegExp(`${searchKey}`)
    }


    // 获取存在黑名单
    let blackList=[]
    if (req.headers.authorization){
        await UserCountTables.find({token:req.headers.authorization}).then( async userInfo=>{
            await UserDetailTables.find({key:userInfo[0].key}).then(userDetail=>{
                blackList=userDetail[0].blacklist
            })
        })
    }

    let totalNum=0
    if (blackList.length){
        //存在黑名单
        // 返回总数和数据

        await BlogTables.find({
            ...params,//根据key查找
            approve: true,
            'author.userName':{
                $nin:blackList
            }
        }).then(rs=>{
            totalNum=rs.length
        })

        BlogTables.find({
            ...params,//根据key查找
            approve: true,
            'author.userName':{
                $nin:blackList
            }
        },{
            content:false,
            _id:false,
            __v:false
        },{
            limit:Number(limit),
            skip:Number(offset),
            sort:{
                lastModified: -1
            }
        }).then(blogList=>{
            res.send({
                status:"200",
                message:"查询成功",
                data:{
                    blogList,
                    totalNum
                }
            })
        })

    }else {
        await BlogTables.find({
            ...params,//根据key查找
            approve: true,
        }).then(rs=>{
            totalNum=rs.length
        })
        BlogTables.find({
            ...params,//根据key查找
            approve: true,
        },{
            content:false,
            _id:false,
            __v:false
        },{
            limit:Number(limit),
            skip:Number(offset),
            sort:{
                lastModified: -1
            }
        }).then(blogList=>{
            res.send({
                status:"200",
                message:"查询成功",
                data:{
                    blogList,
                    totalNum
                }
            })
        })
    }

})


//根据id 查询博客的详情
blogApp.get('/getBlogDetailById',async function (req,res){
    //鉴权 查询博客需要id
    let blogId=req.query.blogId

    //同步的增加访问量
    await BlogTables.updateOne({
        blogId:blogId
    },{
        $inc:{
            views: 1
        }
    }).then(() => {
        console.log('博客阅览数自增1')
    });

    BlogTables.find({
        blogId:blogId
    },{
        __v:false,
        _id:false
    }).then(rs=>{
        res.send({
            status:200,
            message:"查询成功",
            data:{
                blogData: rs[0]
            }
        })
    })



})


blogApp.post('/comment/create', function (req, res) {
    //获得博客的数据
    let reqData = req.body;

    //完整的博客评论数据
    let commentData = {
        ...reqData.comment,
        lastModified: new Date(),
        commentId: v4(),
    }

    //把博客数据添加到 用户的详情表
    UserCountTables.find({
        token:req.headers.authorization
    }).then(rs=>{
        let key = rs[0].key;
        // 把评论添加到  用户的comment字段中去
        //如果多个评论 那就是追加
        UserDetailTables.updateOne({
            key:rs[0].key,
            comments: {
                $elemMatch:{
                    blogId: reqData.blogId
                }
            }
        },{
            $push:{
                //commentData 数组 存放对文章的多个评论
                'comments.$.commentData':{
                    ...commentData
                }
            }
        }).then(async (rs)=>{
            if (rs.n<1){
                // 在用户详情表里面当前没有这个博客id的评论数据
                let blogData = {} ;// 取出这个博客的一些基本信息
                await BlogTables.find({
                    blogId: reqData.blogId
                },{
                    title: true,
                    author: true,
                    cover: true,
                    description: true,
                    lastModified:true
                }).then(rs => {
                    blogData = rs[0]
                });

                UserDetailTables.updateOne({
                    key
                },{
                    $push: {
                        'comments': {
                            blogId: reqData.blogId,
                            blogData,
                            commentData:[
                                commentData
                            ]
                        }
                    }
                }).then(rs => {
                    console.log('创建新博客id的评论数据');
                });
            }
        })
    })

    //博客的评论
    if (reqData.fatherId){
        //二级评论
        BlogTables.updateOne({
            blogId: reqData.blogId,
            comment: {
                $elemMatch: {
                    commentId: reqData.fatherId
                }
            }
        }, {
            $push: {
                'comment.$.comment': commentData
            }
        }).then(rs =>{
            console.log('新增一个二级评论');
            res.send({
                status:200,
                message: '评论成功',
                data: {
                    commentData
                }
            })
        })

    }else {
        //文章品论
        // 往博客里面的某个评论添加值
        BlogTables.updateOne({
            blogId: reqData.blogId
        }, {
            $push: {
                'comment': commentData
            }
        }).then(rs =>{
            console.log('新增一个二级评论');
            res.send({
                status:200,
                message: '评论成功',
                data: {
                    commentData
                }
            })
        })
    }

})

// 获取我的博客文章
blogApp.get("/getMyBlog",function (req,res){
    //找到我的信息-->去博客中查询作者
    //获得博客的数据
    //获取数据
    let params={}
    let offset=req.query.offset
    let limit=req.query.limit
    let searchKey =req.query.searchKey
    //searchKey 查询
    if(searchKey){
        params.title=searchKey
    }

    UserCountTables.find({
        token:req.headers.authorization
    }).then( async rs=>{
        //要做分页 需要 总数
        let totalNum=0
        await BlogTables.find({
            'author.userName':rs[0].userName
        }).then(blogList=>{
            totalNum=blogList.length
        })

        //返回某页数据
        BlogTables.find({
            'author.userName':rs[0].userName,
            ...params,//根据key查找
        },{
            content:false,
            _id:false,
            __v:false
        },{
            limit:Number(limit),
            skip:Number(offset),
            sort:{
                lastModified: -1
            }
        }).then(blogList=>{
            res.send({
                status:"200",
                message:"查询成功",
                data:{
                    blogList,
                    totalNum
                }
            })
        })

    })
})


//获取我的喜欢
blogApp.get("/getMyLikeBlog",function (req,res){
//获取我的喜欢的列表  去博客表查询
    let params={}
    let offset=req.query.offset
    let limit=req.query.limit
    let searchKey =req.query.searchKey
    //searchKey 查询
    if(searchKey){
        params.title=searchKey
    }

    UserCountTables.find({
        token:req.headers.authorization
    }).then( async rs=> {
        //查询唔喜欢的列表
        let likeList=[]
        await UserDetailTables.find({
            key:rs[0].key
        }).then(likeLists=>{
            likeList=likeLists[0].likes
        })

        //要做分页 需要 总数
        let totalNum = 0
        await BlogTables.find({
            blogId: {
                $in:likeList
            },
        }).then(blogList => {
            totalNum = blogList.length
        })

        //返回
        BlogTables.find({
            blogId: {
                $in:likeList
            },
            ...params,//根据key查找
        },{
            content:false,
            _id:false,
            __v:false
        },{
            limit:Number(limit),
            skip:Number(offset),
            sort:{
                lastModified: -1
            }
        }).then(blogList=>{
            res.send({
                status:"200",
                message:"查询成功",
                data:{
                    blogList,
                    totalNum
                }
            })
        })
    })
})


// 返回没有通过审核的文章
blogApp.get('/getUnapprovedBlog',async function (req,res){

    //获取数据
    let params={}
    let offset=req.query.offset
    let limit=req.query.limit
    let searchKey =req.query.searchKey

    console.log(offset,limit)
    //searchKey 查询
    if(searchKey){
        params.title = new RegExp(`${searchKey}`)
    }


    let totalNum=0

    await BlogTables.find({
        ...params,//根据key查找
        approve: false,
    }).then(rs=>{
        totalNum=rs.length
    })
    BlogTables.find({
        ...params,//根据key查找
        approve: false,
    },{
        _id:false,
        __v:false
    },{
        limit:Number(limit),
        skip:Number(offset),
        sort:{
            lastModified: -1
        }
    }).then(blogList=>{
        res.send({
            status:"200",
            message:"查询成功",
            data:{
                blogList,
                totalNum
            }
        })
    })
})

//通过
blogApp.post("/approvedBlog",function (req,res){
//
    UserCountTables.find({
        token: req.headers.authorization
    }).then(async (rs)=>{
        if (rs.length && rs[0].isAdmin){
            BlogTables.updateOne({
                blogId: req.body.blogId
            },{
                $set:{
                    approve: true
                }
            }).then(()=>{
                res.send({
                    status: 200,
                    message: '文章审核通过'
                })
            })
        }else{
            res.send({
                status: 401,
                message: '没有操作权限'
            })
        }
    })



})

//不通过删除
blogApp.post("/deleteBlog",function (req,res){
//
    UserCountTables.find({
        token: req.headers.authorization
    }).then(async (rs)=>{
        if (rs.length && rs[0].isAdmin){
            BlogTables.deleteOne({
                blogId: req.body.blogId
            }).then(()=>{
                res.send({
                    status: 200,
                    message: '文章删除'
                })
            })
        }else{
            res.send({
                status: 401,
                message: '没有操作权限'
            })
        }
    })



})


//查询所有的博客
blogApp.get('/getAllBlog',async function (req,res){

    //获取数据
    let params={}
    let offset=req.query.offset
    let limit=req.query.limit
    let searchKey =req.query.searchKey

    console.log(offset,limit)
    //searchKey 查询
    if(searchKey){
        params.title = new RegExp(`${searchKey}`)
    }


    let totalNum=0

    await BlogTables.find({
        ...params,//根据key查找
    }).then(rs=>{
        totalNum=rs.length
    })
    BlogTables.find({
        ...params,//根据key查找
    },{
        _id:false,
        __v:false
    },{
        limit:Number(limit),
        skip:Number(offset),
        sort:{
            lastModified: -1
        }
    }).then(blogList=>{
        res.send({
            status:"200",
            message:"查询成功",
            data:{
                blogList,
                totalNum
            }
        })
    })
})


//博客的数据
blogApp.get("/getBlogInfo",function (req,res){
//
    UserCountTables.find({
        token: req.headers.authorization
    }).then(async (rs)=>{
        if (rs.length && rs[0].isAdmin){
            BlogTables.find({},{
                lastModified:true
            }).then((blogInfo)=>{
                res.send({
                    status: 200,
                    message: '查询成功',
                    data:{
                        blogInfo
                    }
                })
            })
        }else{
            res.send({
                status: 401,
                message: '没有操作权限'
            })
        }
    })



})




module.exports={blogApp}




















